上篇講解找不到綁定的this,因此 setState 才會 undefined,此篇會講解如何解決上述狀況的四種方式。
按了按鈕,訊息改變
在render method
裡 event 事件方法綁定 this
handleClickMessage() {
console.log(this);
this.setState({
message: '訊息已改變'
})
}
render() {
return (
<div>
<div>{this.state.message}</div>
<button onClick={this.handleClickMessage.bind(this)}>click</button>
</div>
)
}
this
,因此可以呼叫 this.setState
與第一種方式一樣,只是改用 arrow function,因此可以看到 handleClickMessage 有 + 小括弧
render() {
return (
<div>
<div>{this.state.message}</div>
<button onClick={() => this.handleClickMessage()}>click</button>
</div>
)
}
與第一種方式雷同,但綁定的方法改放在 constructor,最後結論會在說明差別在哪裡。
import React, { Component } from 'react'
class EventBind extends Component {
constructor(props) {
super(props)
this.state = {
message: '初始訊息'
}
// 在 constructor 綁定事件方法
this.handleClickMessage = this.handleClickMessage.bind(this);
}
handleClickMessage() {
console.log(this);
this.setState({
message: '訊息已改變'
})
}
render() {
return (
<div>
<div>{this.state.message}</div>
<button onClick={this.handleClickMessage}>click</button>
</div>
)
}
}
export default EventBind
事件處理的方法直接使用 arrow function
import React, { Component } from 'react'
class EventBind extends Component {
constructor(props) {
super(props)
this.state = {
message: '初始訊息'
}
}
// 方法直接使用 arrow function
handleClickMessage = () => {
console.log(this);
this.setState({
message: '訊息已改變'
})
}
render() {
return (
<div>
<div>{this.state.message}</div>
<button onClick={this.handleClickMessage}>click</button>
</div>
)
}
}
export default EventBind
render
裡面,若有需要 rerender 重新渲染
的情況,可能會有效能上的問題。將參數傳給 Event Handler
。以下舉例為傳送參數 id:<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
我還在學習的階段,若有寫錯的訊息,都可以直接留言告知感謝!!!